//package com.base.app.utils;
//
//import org.docx4j.com.microsoft.schemas.office.drawing.x2014.chartex.CTText;
//import org.docx4j.model.datastorage.BindingHandler;
//import org.docx4j.model.datastorage.migration.VariablePrepare;
//import org.docx4j.openpackaging.packages.WordprocessingMLPackage;
//import org.docx4j.openpackaging.parts.WordprocessingML.MainDocumentPart;
//import org.docx4j.wml.*;
//import org.w3c.dom.Document;
//import org.w3c.dom.Element;
//
//import javax.xml.parsers.DocumentBuilderFactory;
//import java.io.File;
//import java.util.*;
//import java.util.regex.Matcher;
//import java.util.regex.Pattern;
///**
// * @author Simon
// * @create 2025/3/11
// * @Description
// **/
//
//public class Docx4jUtil {
//
//    // 加载 Word 文档
//    public static WordprocessingMLPackage loadDocument(String path) throws Exception {
//        return WordprocessingMLPackage.load(new File(path));
//    }
//
//    // 获取所有标签（占位符或内容控件）
//    public static List<String> getAllTags(WordprocessingMLPackage wordPackage) {
//        MainDocumentPart mdp = wordPackage.getMainDocumentPart();
//        List<Object> elements = mdp.getContent();
//        List<String> tags = new ArrayList<>();
//
//        for (Object element : elements) {
//            if (element instanceof SdtElement) {
//                SdtElement sdt = (SdtElement) element;
//                String tagName = sdt.getSdtPr().getTag() != null ? sdt.getSdtPr().getTag().getVal() : null;
//                if (tagName != null && !tags.contains(tagName)) {
//                    tags.add(tagName);
//                }
//            }
//        }
//
//        if (tags.isEmpty()) {
//            String xml = mdp.getXML();
//            Pattern pattern = Pattern.compile("\\$\\{([^}]+)\\}");
//            Matcher matcher = pattern.matcher(xml);
//            while (matcher.find()) {
//                String tagName = matcher.group(1);
//                if (!tags.contains(tagName)) {
//                    tags.add(tagName);
//                }
//            }
//        }
//        return tags;
//    }
//
//    // 获取选择字段及其选项
//    public static Map<String, List<String>> getSelectionFields(WordprocessingMLPackage wordPackage) {
//        MainDocumentPart mdp = wordPackage.getMainDocumentPart();
//        List<Object> elements = mdp.getContent();
//        Map<String, List<String>> selectionFields = new HashMap<>();
//
//        for (Object element : elements) {
//            if (element instanceof SdtElement) {
//                SdtElement sdt = (SdtElement) element;
//                String tagName = sdt.getSdtPr().getTag() != null ? sdt.getSdtPr().getTag().getVal() : null;
//                if (tagName != null && tagName.startsWith("selection_")) {
//                    List<String> options = Arrays.asList("Option1", "Option2", "Option3"); // 需实际配置
//                    selectionFields.put(tagName, options);
//                }
//            }
//        }
//        return selectionFields;
//    }
//
//    // 普通占位符替换
//    public static void simpleReplace(WordprocessingMLPackage wordPackage, Map<String, String> userInput, String outputPath) throws Exception {
//        MainDocumentPart mdp = wordPackage.getMainDocumentPart();
//        mdp.variableReplace(userInput);
//        wordPackage.save(new File(outputPath));
//    }
//
//    // OpenDoPE 数据绑定并生成文档
//    public static void bindDataAndGenerate(WordprocessingMLPackage wordPackage, Map<String, String> userInput, String outputPath) throws Exception {
//        // 创建 XML 数据文档
//        DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance();
//        Document dataDoc = factory.newDocumentBuilder().newDocument();
//        Element root = dataDoc.createElement("data");
//        dataDoc.appendChild(root);
//
//        for (Map.Entry<String, String> entry : userInput.entrySet()) {
//            Element element = dataDoc.createElement(entry.getKey());
//            element.appendChild(dataDoc.createTextNode(entry.getValue()));
//            root.appendChild(element);
//        }
//
//        // 准备绑定（处理变量）
//        VariablePrepare.prepare(wordPackage);
//
//        // 使用 BindingHandler 绑定数据
//        BindingHandler bindingHandler = new BindingHandler(wordPackage);
//        bindingHandler.setData(dataDoc);
//        bindingHandler.applyBindings();
//
//        wordPackage.save(new File(outputPath));
//    }
//
//    // 将普通模板转换为 OpenDoPE 模板
//    public static void convertToOpenDoPETemplate(String inputPath, String outputPath, Map<String, List<String>> selectionOptions) throws Exception {
//        WordprocessingMLPackage wordPackage = loadDocument(inputPath);
//        MainDocumentPart mdp = wordPackage.getMainDocumentPart();
//        List<Object> content = mdp.getContent();
//
//        for (int i = 0; i < content.size(); i++) {
//            Object element = content.get(i);
//            if (element instanceof P) {
//                P paragraph = (P) element;
//                String paragraphText = paragraph.toString();
//                Pattern pattern = Pattern.compile("\\$\\{([^}]+)\\}");
//                Matcher matcher = pattern.matcher(paragraphText);
//
//                while (matcher.find()) {
//                    String fullPlaceholder = matcher.group(0);
//                    String tagName = matcher.group(1);
//
//                    SdtBlock sdt = createContentControl(tagName, fullPlaceholder, selectionOptions);
//                    List<Object> runs = paragraph.getContent();
//                    for (int j = 0; j < runs.size(); j++) {
//                        Object run = runs.get(j);
//                        if (run instanceof R) {
//                            R r = (R) run;
//                            String runText = r.toString();
//                            if (runText.contains(fullPlaceholder)) {
//                                runs.set(j, sdt);
//                                break;
//                            }
//                        }
//                    }
//                }
//            }
//        }
//
//        wordPackage.save(new File(outputPath));
//    }
//
//    // 创建内容控件
//    private static SdtBlock createContentControl(String tagName, String placeholder, Map<String, List<String>> selectionOptions) {
//        SdtBlock sdt = new SdtBlock();
//        SdtPr sdtPr = new SdtPr();
//        Tag tag = new Tag();
//        tag.setVal(tagName);
//        sdtPr.setTag(tag);
//
//        if (tagName.startsWith("image:")) {
//            sdtPr.setPicture(new CTDataBinding());
//        } else if (tagName.startsWith("selection_") && selectionOptions != null && selectionOptions.containsKey(tagName)) {
//            // 使用 CTSdtDropDownList 替代 CTDropDownList
//            CTSdtDropDownList dropdown = new CTSdtDropDownList();
//            for (String option : selectionOptions.get(tagName)) {
//                CTSdtDropDownListItem item = new CTSdtDropDownListItem();
//                item.setValue(option);
//                dropdown.getListItem().add(item);
//            }
//            sdtPr.setDropDownList(dropdown);
//        } else {
//            sdtPr.setText(new CTText());
//        }
//
//        sdt.setSdtPr(sdtPr);
//
//        SdtContentBlock content = new SdtContentBlock();
//        P p = new P();
//        R r = new R();
//        Text text = new Text();
//        text.setValue(placeholder);
//        r.getContent().add(text);
//        p.getContent().add(r);
//        content.getContent().add(p);
//        sdt.setSdtContent(content);
//
//        return sdt;
//    }
//}